package pe.com.hermes.hermetic.modelo.daoimpl;

import com.ibatis.sqlmap.client.SqlMapClient;

import pe.com.hermes.hermetic.beans.AbonoBean;
import pe.com.hermes.hermetic.beans.EstadoBean;
import pe.com.hermes.hermetic.beans.MatrizBean;
import pe.com.hermes.hermetic.beans.PuntoBean;
import pe.com.hermes.hermetic.beans.TiposBean;

import pe.com.hermes.hermetic.modelo.dao.PuntoDAO;
import pe.com.hermes.hermetic.negocio.ultil.CadenaUtil;

import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

import java.util.Map;

import javax.sql.DataSource;

import oracle.jdbc.OracleTypes;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.CallableStatementCallback;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;


@Repository("puntoDAO")
public class PuntoDAOImpl implements PuntoDAO {
    @Autowired
    protected JdbcTemplate jdbcTemplate;
    private Logger logger = Logger.getLogger(this.getClass());
    @Autowired
    private SqlMapClient sqlMapClient;

    /*americo*/

    public List getListadoPunto(String codigoCliente, String descripcionPunto, 
                                String codigoEquivalente, 
                                String codigoSucursal, String moneda) {
        logger.info("Obtener listado de solicitud de pedidos.");
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        DataSource ds = jdbcTemplate.getDataSource();
        List listado = new ArrayList();
        String SQL = null;
        SQL = 
"select a.des_punt, a.cod_punt, a.cod_equi, a.cod_equi_agen, a.cod_clie_grup, a.tip_punt, a.des_dire_punt" + 
  " from   ve_punto a" + " where  (a.des_punt like upper('%" + 
  descripcionPunto + "%') and (a.cod_equi_agen = '" + codigoEquivalente + 
  "' or '" + codigoEquivalente + "' is null))" + 
  " and    a.ind_usua_serv      = 1";        
        try {
            conn = ds.getConnection();
            pstmt = conn.prepareStatement(SQL);
            CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
            rs = pstmt.executeQuery();

            while (rs.next()) {
                PuntoBean punto = new PuntoBean();
                punto.setDesPunto(rs.getString("des_punt"));
                punto.setCodPunto(rs.getString("cod_punt"));
                punto.setCodEqui(rs.getString(3));
                punto.setCodEquiAgen(rs.getString(4));
                punto.setDesEquiAgen(rs.getString(5));
                punto.setCodCliente(rs.getString("cod_clie_grup"));
                punto.setTipo(rs.getString("tip_punt"));
                punto.setDesDire(rs.getString("des_dire_punt"));
                punto.setDespuntoDirec(rs.getString("des_punt") + " (" + 
                                       rs.getString("des_dire_punt") + ")");
                listado.add(punto);
            }


        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // Close ResultSet, PreparedStatement and Connection
                if(rs!=null) rs.close();
                if(pstmt!=null)pstmt.close();
                if(conn!=null)conn.close();
            } catch (Exception ex) { // Catch All exceptions
                ex.printStackTrace();

            }
        }
        return listado;
    }

    /**Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    DataSource ds = jdbcTemplate.getDataSource();
    List listado = new ArrayList();
    String  SQL = null;
    if (moneda.equals("2"))
     SQL    = "select distinct a.des_punt, a.cod_punt, a.cod_equi, a.cod_equi_agen, a.cod_clie_grup, a.tip_punt, a.des_dire_punt" +
             " from   (" +
             " select a.des_punt, a.cod_punt, a.cod_equi, a.cod_equi_agen, a.cod_clie_grup, a.tip_punt, a.des_dire_punt" +
             " from   ve_punto a" +
             " where  a.cod_clie_grup      = "+ codigoCliente +"" +
             " and    (a.des_punt like upper('%"+ descripcionPunto +"%') and (a.cod_equi_agen = '"+ codigoEquivalente +"' or '"+ codigoEquivalente +"' is null))" +
             " and    a.ind_usua_serv      = 1" +
             " and    a.tip_punt not in (11,2,3)" +
             " UNION ALL" +
             " select distinct a.des_punt, a.cod_punt, a.cod_equi, a.cod_equi_agen, a.cod_clie_grup, a.tip_punt, a.des_dire_punt" +
             " from   ve_orde_serv c, ve_cliente b, ve_punto a" +
             " where  a.cod_clie_grup     != "+ codigoCliente +"" +
             " and    (a.des_punt like upper('%"+ descripcionPunto +"%') and (a.cod_equi_agen = '"+ codigoEquivalente +"' or '"+ codigoEquivalente +"' is null))" +
             " and    a.tip_punt in (5,9)" +
             " and    a.ind_usua_serv      = 1" +
             " and    b.cod_clie           = a.cod_clie_grup" +
             " and    c.cod_punt_usua_serv = a.cod_punt" +
             " and    c.est_docu           = '6'" +
             " and    c.tip_form_tras      = '1'" +
             " and    c.cod_serv in (2,3)" +
             " UNION ALL" +
             " select distinct a.des_punt, a.cod_punt, a.cod_equi, a.cod_equi_agen, a.cod_clie_grup, a.tip_punt, a.des_dire_punt" +
             " from   ve_orde_serv b, ve_punto a" +
             " where  a.cod_clie_grup != "+ codigoCliente +"" +
             " and    (a.des_punt like upper('%"+ descripcionPunto +"%') and (a.cod_equi_agen = '"+ codigoEquivalente +"' or '"+ codigoEquivalente +"' is null))" +
             " and    a.tip_punt in (5,9)" +
             " and    a.ind_usua_serv  = 1" +
             " and    a.cod_locd      != (select distinct cod_locd from ve_punto where" +
             "                             cod_sucu_htb = "+ codigoSucursal +" and" +
             "                             tip_punt = 6)" +
             " and    b.cod_clie       = a.cod_clie_grup" +
             " and    b.cod_serv in (34,10)" +
             " and    b.cod_locd_orig  = (select distinct cod_locd from ve_punto where" +
             "                             cod_sucu_htb = "+ codigoSucursal+" and" +
             "                             tip_punt = 6)" +
             " and    b.cod_locd_dest  = a.cod_locd" +
             " and    b.est_docu       = '6') a" +
             " order by 1";
     else
       SQL = "select distinct a.des_punt, a.cod_punt, a.cod_equi, a.cod_equi_agen, a.cod_clie_grup, a.tip_punt, a.des_dire_punt" +
             " from   (" +
             " select a.des_punt, a.cod_punt, a.cod_equi, a.cod_equi_agen, a.cod_clie_grup, a.tip_punt, a.des_dire_punt" +
             " from   ve_punto a" +
             " where  a.cod_clie_grup      = "+ codigoCliente +"" +
             " and    (a.des_punt like upper('%"+ descripcionPunto +"%') and (a.cod_equi_agen = '"+ codigoEquivalente +"' or '"+ codigoEquivalente +"' is null))" +
             " and    a.ind_usua_serv      = 1" +
             " and    a.tip_punt not in (11,2,3)" +
             " UNION ALL" +
             " select distinct a.des_punt, a.cod_punt, a.cod_equi, a.cod_equi_agen, a.cod_clie_grup, a.tip_punt, a.des_dire_punt" +
             " from   ve_orde_serv c, ve_cliente b, ve_punto a" +
             " where  a.cod_clie_grup     != "+ codigoCliente +"" +
             " and    (a.des_punt like upper('%"+ descripcionPunto +"%') and (a.cod_equi_agen = '"+ codigoEquivalente +"' or '"+ codigoEquivalente +"' is null))" +
             " and    a.tip_punt in (5,9)" +
             " and    a.ind_usua_serv      = 1" +
             " and    b.cod_clie           = a.cod_clie_grup" +
             " and    c.cod_punt_usua_serv = a.cod_punt" +
             " and    c.est_docu           = '6'" +
             " and    c.tip_form_tras      = '1'" +
             " and    c.cod_serv in (2,3)" +
             " UNION ALL" +
             " select distinct a.des_punt, a.cod_punt, a.cod_equi, a.cod_equi_agen, a.cod_clie_grup, a.tip_punt, a.des_dire_punt" +
             " from   ve_orde_serv b, ve_punto a" +
             " where  a.cod_clie_grup != "+ codigoCliente +"" +
             " and    (a.des_punt like upper('%"+ descripcionPunto  +"%') and (a.cod_equi_agen = '"+ codigoEquivalente +"' or '"+ codigoEquivalente +"' is null))" +
             " and    a.tip_punt in (5,9)" +
             " and    a.ind_usua_serv  = 1" +
             " and    a.cod_locd      != (select distinct cod_locd from ve_punto where" +
             "                             cod_sucu_htb = "+ codigoSucursal +" and" +
             "                             tip_punt = 6)" +
             " and    b.cod_clie       = a.cod_clie_grup" +
             " and    b.cod_serv in (34,10)" +
             " and    b.cod_locd_orig  = (select distinct cod_locd from ve_punto where" +
             "                             cod_sucu_htb = "+ codigoSucursal +" and" +
             "                             tip_punt = 6)" +
             " and    b.cod_locd_dest  = a.cod_locd" +
             " and    b.est_docu       = '6') a" +
             " order by 1";

    try{
    conn = ds.getConnection();
    System.out.println("SQL BUSQUEDA: " +SQL);
    pstmt = conn.prepareStatement(SQL);

    rs = pstmt.executeQuery();

    while (rs.next()) {
    PuntoBean punto = new PuntoBean();
    punto.setDesPunto(rs.getString("des_punt"));
    punto.setCodPunto(rs.getString("cod_punt"));
    punto.setCodEqui(rs.getString(3));
    punto.setCodEquiAgen(rs.getString(4));
    punto.setDesEquiAgen(rs.getString(5));
    punto.setCodCliente(rs.getString("cod_clie_grup"));
    punto.setTipo(rs.getString("tip_punt"));
    punto.setDesDire(rs.getString("des_dire_punt"));
    punto.setDespuntoDirec(rs.getString("des_punt")+" ("+rs.getString("des_dire_punt")+")");
    listado.add(punto);
    }


    }catch(Exception e){
    e.printStackTrace();
    }
    finally {
      try {
          // Close ResultSet, PreparedStatement and Connection
          rs.close();
          pstmt.close();
          conn.close();
      } catch (Exception ex) { // Catch All exceptions
          ex.printStackTrace();

      }
    }*/
    public List getBusquedaPunto(final String codigoCliente, 
                                 final String descripcionPunto, 
                                 final String codigoEquivalente, 
                                 final String codigoSucursal, 
                                 final String moneda,
                                 final String tipoPunto) {
        logger.info("Obtener listado de solicitud de pedidos.");
        logger.info("codigoCliente : "+codigoCliente);
        logger.info("descripcionPunto : "+descripcionPunto);
        logger.info("codigoEquivalente : "+codigoEquivalente);
        logger.info("codigoSucursal : "+codigoSucursal);
        logger.info("moneda : "+moneda);
        logger.info("tipoPunto : "+tipoPunto);
        
        String SQL = 
            "{ call APERTURA.HWPG_PUNT.HWPR_LIST_PUNT(?,?,?,?,?,?,?,?) }";CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);    
        final List listado = new ArrayList();
        CallableStatementCallback cs = new CallableStatementCallback() {
                public Object doInCallableStatement(CallableStatement arg0) throws DataAccessException, 
                                                                                   SQLException {
                    arg0.setString(1, codigoCliente);
                    arg0.setString(2, descripcionPunto);
                    arg0.setString(3, codigoEquivalente);
                    arg0.setString(4, codigoSucursal);
                    arg0.setString(5, moneda);
                    arg0.setString(6, tipoPunto);
                    arg0.registerOutParameter(7, OracleTypes.VARCHAR);
                    arg0.registerOutParameter(8, OracleTypes.CURSOR);
                    arg0.execute();
                    ResultSet rs = (ResultSet)arg0.getObject(8);
                    while (rs.next()) {
                        PuntoBean punto = new PuntoBean();
                        punto.setDesPunto(rs.getString("des_punt"));
                        punto.setCodPunto(rs.getString("cod_punt"));
                        punto.setCodEqui(rs.getString(3));
                        punto.setCodEquiAgen(rs.getString(4));
                        punto.setDesEquiAgen(rs.getString(5));
                        punto.setCodCliente(rs.getString("cod_clie_grup"));
                        punto.setTipo(rs.getString("tip_punt"));
                        punto.setDesDire(rs.getString("des_dire_punt"));
                        punto.setDespuntoDirec(rs.getString("des_punt") + 
                                               " (" + 
                                               rs.getString("des_dire_punt") + 
                                               ")");
                        listado.add(punto);
                    }
                    return listado;
                }
            };
        this.jdbcTemplate.execute(SQL, cs);

        return listado;
    }

    public void setSqlMapClient(SqlMapClient sqlMapClient) {
        this.sqlMapClient = sqlMapClient;
    }

    public List getPuntosPorCliente(String listCodCliente, String desPunto,String listCodSucu) {
        Map map = new HashMap();
        map.put("P_DESC_PUNT",desPunto);
        map.put("P_LIST_CLIE",listCodCliente);
        map.put("P_LIST_SUCU",listCodSucu);
        List listPuntos = new ArrayList();
        try{
            sqlMapClient.queryForObject("getPuntosPorClie",map);
            listPuntos = (List)map.get("S_LIST");
        }catch(Exception e){
            logger.error(e);
        }
        return listPuntos;
    }

    public List getMantenimPuntosEqui(int sucursal, String grupCliente,
                                      String desAgencia, int codCorp,
                                      int flagAgenciasSinAsignar) {
                                             
      Map map = new HashMap();
      map.put("P_COD_SUCU_HTB",sucursal);
      map.put("P_COD_CLIE",grupCliente);
      map.put("P_DES_AGEN",desAgencia);
      map.put("P_COD_CORP",codCorp);
      map.put("P_SIN_ASIG",flagAgenciasSinAsignar);
      List listPuntos = new ArrayList();
      try{
          sqlMapClient.queryForObject("getMantenimPuntosEqui",map);
          listPuntos = (List)map.get("S_LIST");
      }catch(Exception e){
          logger.error(e);
      }
      return listPuntos;
    }


    /**
     * Clase CuentaMapper para llenar la Lista de Resultados
     */
    protected class BusquedaPuntoMapper implements RowMapper {
        public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
            //Establecer los atributos en la entidad CuentaBean
            PuntoBean punto = new PuntoBean();
            punto.setDesPunto(rs.getString(1));
            punto.setCodPunto(rs.getString(2));
            punto.setCodEqui(rs.getString(3));
            punto.setCodEquiAgen(rs.getString(4));
            punto.setDesEquiAgen(rs.getString(5));
            punto.setCodCliente(rs.getString(6));
            punto.setTipo(rs.getString(7));
            punto.setDesDire(rs.getString(8));
            return punto;
        }
    }

    public String getDescripcionPunto(String codigoPunto) {
        String query = 
            "select des_dire_punt from ve_punto where cod_punt = ? ";
        //Establecer los parametros
        Object[] params = new Object[] { codigoPunto };
        try {
            CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),query);
            return (String)this.jdbcTemplate.queryForObject(query, params, 
                                                            String.class);
        } catch (final EmptyResultDataAccessException e) {
            return "0";
        }
    }

    public String getDescripcionPuntoCarga(String codigoPunto, 
                                           String codigoCliente) {
        //Establecer los parametros
        Object[] params = null;

        String query = 
            "select nvl(des_equi_agen,cod_punt) des_equi_agen" + " from ve_punto" + 
            " where (cod_punt = ? or cod_equi_agen = ?) and";
        if (codigoCliente.toString().equals("1604")) {
            query = query + " cod_clie_grup in (1604,1605,138,149)";
            params = new Object[] { codigoPunto, codigoPunto };
        } else {
            query = 
                    query + " cod_clie_grup = ? and tip_punt in ('1','4','12')";
            params = new Object[] { codigoPunto, codigoPunto, codigoCliente };
        }
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),query);
        try {
            return (String)this.jdbcTemplate.queryForObject(query, params, 
                                                            String.class);
        } catch (final EmptyResultDataAccessException e) {
            return "0";
        }
    }

    /****** NO USAR
    public PuntoBean getPunto(String codigoPunto) {
        String query = 
            "select des_punt, cod_punt, cod_equi ," + " nvl(cod_equi_agen,' '), nvl(des_equi_agen,' ')," + 
            " cod_clie_grup, tip_punt , des_dire_punt from" + 
            " ve_punto where cod_punt = ? ";
        //Establecer los parametros
        Object[] params = new Object[] { codigoPunto };
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),query);
        try {
            return (PuntoBean)this.jdbcTemplate.queryForObject(query, params, 
                                                               new BusquedaPuntoMapper());
        } catch (final EmptyResultDataAccessException e) {
            return null;
        }
    }*/
    
    public PuntoBean getPunto(final String codigoPunto) {

        String SQL = "{ call APERTURA.HWPG_PUNT.HWPR_LIST_DET_PUNT(?,?,?,?) }";
        final PuntoBean puntoBean = new PuntoBean();
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        this.jdbcTemplate.execute(SQL, new CallableStatementCallback() {
                    public Object doInCallableStatement(CallableStatement arg0) throws DataAccessException, 
                                                                                       SQLException {
                        arg0.setString(1, codigoPunto);                        
                        arg0.registerOutParameter(2, OracleTypes.CURSOR);
                        arg0.registerOutParameter(3, OracleTypes.NUMBER);
                        arg0.registerOutParameter(4, OracleTypes.VARCHAR); 
                        arg0.execute();
                        ResultSet rs = (ResultSet)arg0.getObject(2);
                        //PuntoBean puntoBean = null;

                        if (rs.next()) {
                            //puntoBean = new PuntoBean();                            
                            puntoBean.setDesPunto(rs.getString(1));
                            puntoBean.setCodPunto(rs.getString(2));
                            puntoBean.setCodEqui(rs.getString(3));
                            puntoBean.setCodEquiAgen(rs.getString(4));
                            puntoBean.setDesEquiAgen(rs.getString(5));
                            puntoBean.setCodCliente(rs.getString(6));
                            puntoBean.setTipo(rs.getString(7));
                            puntoBean.setDesDire(rs.getString(8));                            
                        }

                        return puntoBean;
                    }
                });

        return puntoBean;

    }


    public List getPuntos(String sucursal, String cliente) {
        String SQL = 
            "select des_punt,cod_punt,des_dire_punt,tip_punt,cod_locd from ve_punto" + 
            " where  cod_sucu_htb = ? and " + " cod_clie_grup = ? and " + 
            " ind_usua_serv = 1 and tip_punt not in (14,11,3) order by 1";CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);    
        Object[] params = new Object[] { sucursal, cliente };
        return jdbcTemplate.query(SQL, params, new PuntoMapper());
    }

    protected class PuntoMapper implements RowMapper {
        public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
            //Establecer los atributos en la entidad CuentaBean
            PuntoBean punto = new PuntoBean();
            punto.setDesPunto(rs.getString(1));
            punto.setCodPunto(rs.getString(2));
            punto.setDesDire(rs.getString(3));
            punto.setTipo(rs.getString(4));
            return punto;
        }
    }


    public List getMantenimPuntos(final String sucursal, final String cliente, 
                                  final String lista, final String listaE, 
                                  final String tipo, final String desAgencia,
                                  final String codMat, final int sonPuntosSinAsignar) {
        String SQL = 
            "{ call APERTURA.HWPG_PUNT.HWPR_LIST_MANT_PTOS(?,?,?,?,?, ?,?,?,?,?) }";
        final List listResult = new ArrayList();
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        CallableStatementCallback cs = new CallableStatementCallback() {
                public Object doInCallableStatement(CallableStatement arg0) throws DataAccessException, 
                                                                                   SQLException {
                    arg0.setString("P_SUCURSAL", sucursal);
                    arg0.setString("P_CLIENTE", cliente);
                    arg0.setString("P_LISTA", lista);
                    arg0.setString("P_LISTAE", listaE);
                    arg0.setString("P_TIPO", tipo);
                    arg0.setString("P_DES_AGEN", desAgencia);
                    arg0.setString("P_COD_MAT", codMat);
                    arg0.setInt("P_IS_SIN_ASIG", sonPuntosSinAsignar);
                    arg0.registerOutParameter("S_QUERY", OracleTypes.VARCHAR);
                    arg0.registerOutParameter("S_LISTA_PUNTOS", OracleTypes.CURSOR);
                    arg0.execute();
                    ResultSet rs = (ResultSet)arg0.getObject("S_LISTA_PUNTOS");
                    PuntoBean puntoBean = null;
                    logger.info(arg0.getString("S_QUERY"));
                    while (rs.next()) {
                        puntoBean = new PuntoBean();
                        puntoBean.setDesPunto(rs.getString(2));
                        puntoBean.setCodPunto(rs.getString(1));
                        puntoBean.setCodEqui(rs.getString(6));
                        puntoBean.setCodEquiAgen(rs.getString(4));
                        puntoBean.setDesEquiAgen(rs.getString(5));
                        puntoBean.setIndUsuaServ(rs.getString(3));
                        puntoBean.setDesDire(rs.getString(7));
                        puntoBean.setCodMatriz(rs.getString(9));
                        puntoBean.setDesMatriz(rs.getString(10));
                        puntoBean.setDesSucuHtb(rs.getString(11));
                        listResult.add(puntoBean);
                    }
                    return listResult;
                }
            };
        this.jdbcTemplate.execute(SQL, cs);

        return listResult;
    }

    public List getMantenimClientes(final String sucursal, 
                                    final String cliente, String lista, 
                                    String listaE, String tipo) {
        String SQL = "";
        /* if (tipo.equals("1")) {
                SQL = "select cod_punt, des_punt, nvl(ind_usua_serv,0) ind_usua_serv," +
                      " nvl(cod_equi_agen,'&nbsp;') cod_equi_agen," +
                      " nvl(des_equi_agen,'&nbsp;') des_equi_agen,"+
                      " cod_equi_agen cod_equi_agen1, des_equi_agen des_equi_agen1  from ve_punto where" +
                      " cod_clie_grup in (select cod_clie from ve_clie_grup where" +
                      " cod_clie_grup = ? ) and" +
                      " cod_sucu_htb = ? and" +
                      " tip_punt not in (3)";
                if (lista != null)
                  if (!lista.equals("0"))
                    SQL = SQL + " and cod_clie_grup = "+lista;
                if (listaE != null)
                  if (listaE.equals("1"))
                    SQL = SQL + " and Nvl(ind_usua_serv,0) = "+listaE;
                  else
                    if (listaE.equals("0"))
                        SQL = SQL + " and Nvl(ind_usua_serv,0) = 0";
                SQL = SQL + " order by des_punt";
            } else {
                SQL = "select cod_punt, des_punt, nvl(ind_usua_serv,0) ind_usua_serv," +
                      " nvl(cod_equi_agen,'') cod_equi_agen," +
                      " nvl(des_equi_agen,'') des_equi_agen,"+
                      " cod_equi_agen cod_equi_agen1, des_equi_agen des_equi_agen1  from ve_punto where" +
                      " cod_clie_grup in (select cod_clie from ve_clie_grup where" +
                      " cod_clie = ? ) and" +
                      " cod_sucu_htb = ? and" +
                      " tip_punt not in (3)";
                if (listaE != null)
                  if (listaE.equals("1"))
                    SQL = SQL + " and Nvl(ind_usua_serv,0) = "+ listaE;
                  else
                    if (listaE.equals("0"))
                        SQL = SQL + " and Nvl(ind_usua_serv,0) = 0";
                SQL = SQL + " order by des_punt";
            } */

        SQL = "{ call APERTURA.HWPG_PUNT.HWPR_LIST_MANT_PTOS(?,?,?) }";
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        //Object[] params = new Object[] {cliente ,sucursal};
        //return jdbcTemplate.query(SQL, params, new PuntosMapper());
        final List listResult = new ArrayList();

        this.jdbcTemplate.execute(SQL, new CallableStatementCallback() {
                    public Object doInCallableStatement(CallableStatement arg0) throws DataAccessException, 
                                                                                       SQLException {
                        arg0.setString(1, cliente);
                        arg0.setString(2, sucursal);
                        arg0.registerOutParameter(3, OracleTypes.CURSOR);
                        arg0.execute();
                        ResultSet rs = (ResultSet)arg0.getObject(3);
                        PuntoBean puntoBean = null;
                        //List listPunto = new ArrayList();
                        // Construye cada item del menu
                        while (rs.next()) {
                            puntoBean = new PuntoBean();
                            puntoBean.setDesPunto(rs.getString(2));
                            puntoBean.setCodPunto(rs.getString(1));
                            puntoBean.setCodEqui(rs.getString(6));
                            puntoBean.setCodEquiAgen(rs.getString(4));
                            puntoBean.setDesEquiAgen(rs.getString(5));
                            puntoBean.setCodCliente(rs.getString(3));
                            puntoBean.setDesDire(rs.getString(7));
                            listResult.add(puntoBean);
                        }
                        return listResult;
                    }
                });

        return listResult;
    }

    /**
        * Clase CuentaMapper para llenar la Lista de Resultados
        */
    protected class PuntosMapper implements RowMapper {
        public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
            //Establecer los atributos en la entidad CuentaBean
            PuntoBean punto = new PuntoBean();
            punto.setDesPunto(rs.getString(2));
            punto.setCodPunto(rs.getString(1));
            punto.setCodEqui(rs.getString(6));
            punto.setCodEquiAgen(rs.getString(4));
            punto.setDesEquiAgen(rs.getString(5));
            punto.setCodCliente(rs.getString(3));
            punto.setDesDire(rs.getString(7));
            return punto;
        }
    }

    public int getCantPuntos(String codEqui, String codPunto, String cliente) {
        String SQL = 
            "Select count(*) from ve_punto Where cod_equi_agen = ?" + "and cod_punt != ? " + 
            "and cod_clie_grup = ?";CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        //Establecer los parametros
        Object[] params = new Object[] { codEqui, codPunto, cliente };
        //Ejecutar el query
        return jdbcTemplate.queryForInt(SQL, params);
    }

    public void actualizarPunto(PuntoBean punto) {
        String SQL = 
            "Update ve_punto set cod_equi_agen= upper(?),des_equi_agen = upper(?) " + 
            ",cod_usua_modi= ? ,fec_ulti_modi=sysdate," + 
            "usu_modi_web =  ?,fec_modi_web = sysdate " + "Where cod_punt = ?";
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        Object[] params = 
            new Object[] { punto.getCodEquiAgen(), punto.getDesEquiAgen(), 
                           punto.getUsuaModi(), punto.getUsuaWeb(), 
                           punto.getCodPunto() };
        jdbcTemplate.update(SQL, params);
    }

    public void insertaPuntoReferencia(String banco, String cliente, 
                                       String cuenta, String referencia, 
                                       String punto) {
        String SQL = 
            "insert into he_clie_cnta_deta (COD_BCO, COD_CLIE_BCO, COD_CNTA, COD_REF_CLIE_BCO," + 
            " COD_PUNT) values (?, ?, ?, ?, ?)";CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        Object[] params = 
            new Object[] { banco, cliente, cuenta, referencia, punto };
        jdbcTemplate.update(SQL, params);
    }

    public void modificaPuntoReferencia(String banco, String cliente, 
                                        String cuenta, String referencia, 
                                        String punto) {
        String SQL = 
            " update he_clie_cnta_deta set cod_ref_clie_bco = ? where " + 
            " COD_BCO = ? and COD_CLIE_BCO = ? and COD_CNTA = ? and COD_PUNT = ?";CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        Object[] params = 
            new Object[] { referencia, banco, cliente, cuenta, punto };
        jdbcTemplate.update(SQL, params);
    }

    public List getPuntosPendienteCliente(String banco, String cliente, 
                                          String cuenta) {
        String SQL = 
            " SELECT distinct cod_punt" + " FROM ve_punto" + " WHERE cod_clie_grup = ?" + 
            " AND cod_punt not in (select distinct cod_punt " + 
            "                       from he_clie_cnta_deta" + 
            "                       where cod_bco = ?" + 
            "                         and cod_clie_bco = ?" + 
            "			      and cod_cnta = ?)";CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        Object[] params = new Object[] { cliente, banco, cliente, cuenta };
        return jdbcTemplate.query(SQL, params, new PuntosMapper3());
    }

    /**
    * Clase CuentaMapper para llenar la Lista de Resultados
    */
    protected class PuntosMapper3 implements RowMapper {
        public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
            //Establecer los atributos en la entidad CuentaBean
            PuntoBean punto = new PuntoBean();
            punto.setCodPunto(rs.getString(1));
            return punto;
        }
    }

    public List getPuntosReferencia(String banco, String cliente, 
                                    String cuenta) {
        String SQL = 
            "select des_punt,a.cod_punt,COD_REF_CLIE_BCO,b.tip_punt from" + 
            " he_clie_cnta_deta a, ve_punto b where" + " a.cod_bco = ? and" + 
            " a.cod_clie_bco = ? and" + " a.cod_cnta = ? and" + 
            " a.cod_punt = b.cod_punt";CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);            
        Object[] params = new Object[] { banco, cliente, cuenta };
        return jdbcTemplate.query(SQL, params, new PuntosMapper2());
    }

    /**
    * Clase CuentaMapper para llenar la Lista de Resultados
    */
    protected class PuntosMapper2 implements RowMapper {
        public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
            //Establecer los atributos en la entidad CuentaBean
            PuntoBean punto = new PuntoBean();
            punto.setDesPunto(rs.getString(1));
            punto.setCodPunto(rs.getString(2));
            punto.setCodCliente(rs.getString(3));
            return punto;
        }
    }

    //Modifique para el HMF2003 seleccionar destino

    public List buscarDestino(String nom) {

        String SQL =
            "select distinct(decode(des_equi_agen,null,des_punt,des_equi_agen)) des_punt, tip_punt, cod_punt, cod_clie_grup, des_dire_punt " + 
            "                    from ve_punto b" + "  where " + 
            " (des_equi_agen like upper('%" + nom + "%')" + 
            " or des_dire_punt like upper('%" + nom + "%'))" + 
            "                  and ind_usua_serv = 1 order by 1 ";CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);    
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        DataSource ds = jdbcTemplate.getDataSource();
        List listado = new ArrayList();

        try {
            conn = ds.getConnection();
            pstmt = conn.prepareStatement(SQL);

            rs = pstmt.executeQuery();

            while (rs.next()) {
                PuntoBean punto = new PuntoBean();
                punto.setDesPunto(rs.getString(1));
                punto.setTipo(rs.getString(2));
                punto.setCodPunto(rs.getString(3));
                punto.setCodCliente(rs.getString(4));
                punto.setDesDire(rs.getString(5));
                listado.add(punto);
            }


        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // Close ResultSet, PreparedStatement and Connection
                if(rs!=null) rs.close();
                if(pstmt!=null) pstmt.close();
                if(conn!=null) conn.close();
            } catch (Exception ex) { // Catch All exceptions
                ex.printStackTrace();

            }
        }
        return listado;
    }

    public PuntoBean getPuntoPorOrigen(String codOrigen) {
        String query =
            "select cod_sucu_htb, cod_locd, tip_punt from ve_punto" + 
            " where cod_punt = ?";CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),query);
        Object[] params = new Object[] { codOrigen };
        try {
            return (PuntoBean)this.jdbcTemplate.queryForObject(query, params, 
                                                               new PuntoMapper2());
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }

    protected class PuntoMapper2 implements RowMapper {
        public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
            //Establecer los atributos en la entidad CuentaBean
            PuntoBean punto = new PuntoBean();
            punto.setNombreCliente(rs.getString(1));
            punto.setCodCliente(rs.getString(2));
            punto.setTipo(rs.getString(3));
            return punto;
        }
    }

   /*** No usar 
    public List buscarPunto(String np, String cg, String sucursal) {

        String SQL = 
            "select des_punt, des_dire_punt, cod_punt" + " from ve_punto a" + 
            " where cod_clie_grup = " + cg + " and" + 
            " (des_punt like upper('%" + np + "%')" + 
            " or des_dire_punt like upper('%" + np + "%')) and" + 
            " ind_usua_serv = 1 and" + " cod_sucu_htb = " + sucursal + " " + 
            " order by 1";
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        DataSource ds = jdbcTemplate.getDataSource();
        List listado = new ArrayList();

        try {
            conn = ds.getConnection();
            pstmt = conn.prepareStatement(SQL);

            rs = pstmt.executeQuery();

            while (rs.next()) {
                PuntoBean punto = new PuntoBean();
                punto.setDesPunto(rs.getString(1));
                punto.setDesDire(rs.getString(2));
                punto.setCodPunto(rs.getString(3));
                listado.add(punto);
            }


        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // Close ResultSet, PreparedStatement and Connection
                if(rs!=null) rs.close();
                if(pstmt!=null) pstmt.close();
                if(conn!=null) conn.close();
            } catch (Exception ex) { // Catch All exceptions
                ex.printStackTrace();

            }
        }
        return listado;
    }
    ****/
    
    public List buscarPunto(final String descPunto, 
                            final String cliente, 
                            final String sucursal,
                            final String listMatrices,
                            final String tipPunt) throws Exception    {
     
        Map map = new HashMap();
        map.put("P_DESC_PUNT",descPunto);
        map.put("P_COD_CLIE",cliente);
        map.put("P_COD_SUCU_HTB",sucursal);
        map.put("P_LIST_MATRICES",listMatrices);
        map.put("P_TIP_PUNT_ORIG",tipPunt);
        List listPuntos=new ArrayList();
        int erro = 0;
        try{
            sqlMapClient.queryForObject("buscarPunto",map);
            erro=(Integer)map.get("S_ERRO");
            if(erro==0)
                listPuntos = (List)map.get("S_LIST");
            else
                throw new Exception((String)map.get("S_MENS"));
        }catch(Exception e){
            logger.error(e);
            e.printStackTrace();
            listPuntos = new ArrayList();
        }
        return listPuntos;
                                 
        /*String SQL = "{ call APERTURA.HWPG_PUNT.HWPR_LIST_PUNT_CLIE_2(?,?,?,?,? ,?,?,?,?) }";
        final List listResult = new ArrayList();
            CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        this.jdbcTemplate.execute(SQL, new CallableStatementCallback() {
                    public Object doInCallableStatement(CallableStatement arg0) throws DataAccessException, 
                                                                                       SQLException {
                        arg0.setString(1, descPunto);
                        arg0.setString(2, cliente);
                        arg0.setString(3, sucursal);   
                        arg0.setString(4, listMatrices);
                        arg0.setString(5, tipPunt);
                        arg0.registerOutParameter(6, OracleTypes.CURSOR);
                        arg0.registerOutParameter(7, OracleTypes.NUMBER);
                        arg0.registerOutParameter(8, OracleTypes.VARCHAR);                        
                        arg0.registerOutParameter(9, OracleTypes.VARCHAR); 
                        arg0.execute();
                        
                        String codError = arg0.getString(7);
                        String mensajeError = arg0.getString(8);                        
                        logger.info("respuesta de Ejecucion: " + new StringBuffer(codError).append(mensajeError).toString());
                        
                        if (codError!=null && codError.equals(String.valueOf(ConstantesHermetic.RESULT_SP_OK))){
                            //resultado correcto
                             ResultSet rs = (ResultSet)arg0.getObject(6);                             
                             PuntoBean puntoBean = null;
                             while (rs.next()) {
                                 puntoBean = new PuntoBean();                                                         
                                 puntoBean.setDesPunto(rs.getString("des_punt"));
                                 puntoBean.setDesDire(rs.getString("des_dire_punt"));
                                 puntoBean.setCodPunto(rs.getString("cod_punt"));
                                 listResult.add(puntoBean);
                             }
                        }else{
                            //resultado con errores                           
                            logger.error("Error de Ejecucion: " + new StringBuffer(codError).append(mensajeError).toString());                    
                        }    
    
                        return listResult;
                    }
                });
    
        return listResult;*/
    }    

    public List getTipoDestino() {
        String SQL = 
            "select cod_tipo,des_tipo from tg_tabl_tipo where cod_grup_tipo=601 and cod_tipo>0";
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        DataSource ds = jdbcTemplate.getDataSource();
        List listado = new ArrayList();
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        try {
            conn = ds.getConnection();
            pstmt = conn.prepareStatement(SQL);
            
            //CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
            //logger.info("getTipoDestino() "+ SQL + this.getClass() + new Exception().getStackTrace()[0].getMethodName());
            
            rs = pstmt.executeQuery();

            while (rs.next()) {
                TiposBean tiposDestino = new TiposBean();
                tiposDestino.setCodigo(rs.getString(1));
                tiposDestino.setDescripcion(rs.getString(2));
                listado.add(tiposDestino);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // Close ResultSet, PreparedStatement and Connection
                if (rs!=null) rs.close();
                if (pstmt!=null) pstmt.close();
                if (conn!=null) conn.close();
            } catch (Exception ex) { // Catch All exceptions
                ex.printStackTrace();

            }
        }
        return listado;
    }

    public List getClientesDestino(String cg, String np) {
        String SQL = 
            " select a.cod_clie_banc ,b.nom_clie,b.ind_acti,a.cod_equi_clie, a.des_equi_clie" + 
            " from hmmc_clie_pedi a" + 
            " inner join ve_cliente b on (b.cod_clie = a.cod_clie_banc)" + 
            " where a.cod_clie=" + cg + " and b.nom_clie like upper ('%" + np + 
            "%')" + " and a.ind_acti = 1" + " order by 2";
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        DataSource ds = jdbcTemplate.getDataSource();
        List listado = new ArrayList();
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        try {
            conn = ds.getConnection();
            pstmt = conn.prepareStatement(SQL);

            rs = pstmt.executeQuery();
            while (rs.next()) {
                PuntoBean clientes = new PuntoBean();
                clientes.setCodPunto(rs.getString(1));
                clientes.setDesPunto(rs.getString(2));
                clientes.setCodCliente(rs.getString(3));
                clientes.setCodEqui(rs.getString(4));
                clientes.setDesEquiAgen(rs.getString(5));
                listado.add(clientes);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // Close ResultSet, PreparedStatement and Connection
                if(rs!=null) rs.close();
                if(pstmt!=null) pstmt.close();
                 if(conn!=null) conn.close();
            } catch (Exception ex) { // Catch All exceptions
                ex.printStackTrace();

            }
        }
        return listado;
    }

    public boolean validaClientesDestino(String cg) {
        boolean existe = false;
        String SQL = 
            " select cod_clie " + " from hmmc_clie_pedi " + " where cod_clie=" + 
            cg + " and ind_acti = 1 ";
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        DataSource ds = jdbcTemplate.getDataSource();
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        try {
            conn = ds.getConnection();
            pstmt = conn.prepareStatement(SQL);

            rs = pstmt.executeQuery();
            if (rs.next()) {
                existe = true;
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // Close ResultSet, PreparedStatement and Connection
               if(rs!=null) rs.close();
               if(pstmt!=null) pstmt.close();
               if(conn!=null) conn.close();
            } catch (Exception ex) { // Catch All exceptions
                ex.printStackTrace();

            }
        }

        return existe;
    }


    public List getEquiClientes(final String codCliente, 
                                final String codClieDestino) {

        String SQL = 
            "{ call APERTURA.HWPG_PUNT.HWPR_LIST_EQUI_CLIE(?,?,?,?) }";
        final List listResult = new ArrayList();
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        this.jdbcTemplate.execute(SQL, new CallableStatementCallback() {
                    public Object doInCallableStatement(CallableStatement arg0) throws DataAccessException, 
                                                                                       SQLException {
                        arg0.setString(1, codCliente);
                        arg0.setString(2, codClieDestino);
                        arg0.setString(3, "");
                        arg0.registerOutParameter(4, OracleTypes.CURSOR);
                        arg0.execute();
                        ResultSet rs = (ResultSet)arg0.getObject(4);
                        PuntoBean puntoBean = null;

                        while (rs.next()) {
                            puntoBean = new PuntoBean();
                            puntoBean.setCodPunto(rs.getString(1));
                            puntoBean.setDesPunto(rs.getString(2));
                            puntoBean.setCodEquiAgen(rs.getString(3));
                            puntoBean.setDesEquiAgen(rs.getString(4));
                            puntoBean.setCodCliente(rs.getString(5));
                            listResult.add(puntoBean);
                        }

                        return listResult;
                    }
                });

        return listResult;

    }

    public List getEquiClientes(final String codCliente, 
                                final String codClieDestino, 
                                final String desDestino) {

        String SQL = 
            "{ call APERTURA.HWPG_PUNT.HWPR_LIST_EQUI_CLIE(?,?,?,?) }";
        final List listResult = new ArrayList();
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        this.jdbcTemplate.execute(SQL, new CallableStatementCallback() {
                    public Object doInCallableStatement(CallableStatement arg0) throws DataAccessException, 
                                                                                       SQLException {
                        arg0.setString(1, codCliente);
                        arg0.setString(2, codClieDestino);
                        arg0.setString(3, desDestino);
                        arg0.registerOutParameter(4, OracleTypes.CURSOR);
                        arg0.execute();
                        ResultSet rs = (ResultSet)arg0.getObject(4);
                        PuntoBean puntoBean = null;

                        while (rs.next()) {
                            puntoBean = new PuntoBean();
                            puntoBean.setCodPunto(rs.getString(1));
                            puntoBean.setDesPunto(rs.getString(2));
                            puntoBean.setCodEquiAgen(rs.getString(3));
                            puntoBean.setDesEquiAgen(rs.getString(4));
                            puntoBean.setCodCliente(rs.getString(5));
                            listResult.add(puntoBean);
                        }

                        return listResult;
                    }
                });

        return listResult;

    }

    public List getEstado() {

        String SQL = "{ call APERTURA.HWPG_TABL.HWPR_LIST_ESTA(?) }";
        final List listResult = new ArrayList();
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        this.jdbcTemplate.execute(SQL, new CallableStatementCallback() {
                    public Object doInCallableStatement(CallableStatement arg0) throws DataAccessException, 
                                                                                       SQLException {
                        arg0.registerOutParameter(1, OracleTypes.CURSOR);
                        arg0.execute();
                        ResultSet rs = (ResultSet)arg0.getObject(1);
                        EstadoBean estadoBean = null;

                        while (rs.next()) {
                            estadoBean = new EstadoBean();
                            estadoBean.setCodigo(rs.getString(1));
                            estadoBean.setDescripcion(rs.getString(2));
                            listResult.add(estadoBean);
                        }

                        return listResult;
                    }
                });

        return listResult;

    }

    public int actualizarEquiCliente(final PuntoBean punto) {

        String SQL = 
            "{ call APERTURA.HWPG_PUNT.HWPR_MODI_EQUI_CLIE(?,?,?,?,?,?,?) }";
        final int resultado = 0;
        int respuesta = 0;
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        this.jdbcTemplate.execute(SQL, new CallableStatementCallback() {
                    public Object doInCallableStatement(CallableStatement arg0) throws DataAccessException, 
                                                                                       SQLException {
                        arg0.setString(1, punto.getCodCliente());
                        arg0.setString(2, punto.getCodPunto());
                        arg0.setString(3, punto.getCodEquiAgen());
                        arg0.setString(4, punto.getDesEquiAgen());
                        arg0.setString(5, punto.getEstado());
                        arg0.setString(6, punto.getUsuaWeb());
                        arg0.registerOutParameter(7, OracleTypes.VARCHAR);
                        arg0.execute();
                        //respuesta = arg0.getInt(7);

                        return resultado;
                    }
                });

        return resultado;

    }

    public List getEquiClienteDestino(final String codCliente, 
                                      final String desDestino) {

        String SQL = 
            "{ call APERTURA.HWPG_PUNT.HWPR_LIST_EQUI_CLIE_DEST(?,?,?) }";
        final List listResult = new ArrayList();
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        this.jdbcTemplate.execute(SQL, new CallableStatementCallback() {
                    public Object doInCallableStatement(CallableStatement arg0) throws DataAccessException, 
                                                                                       SQLException {
                        arg0.setString(1, codCliente);
                        arg0.setString(2, desDestino);
                        arg0.registerOutParameter(3, OracleTypes.CURSOR);
                        arg0.execute();
                        ResultSet rs = (ResultSet)arg0.getObject(3);
                        PuntoBean puntoBean = null;

                        while (rs.next()) {
                            puntoBean = new PuntoBean();
                            puntoBean.setCodPunto(rs.getString(1));
                            puntoBean.setDesPunto(rs.getString(2));
                            listResult.add(puntoBean);
                        }

                        return listResult;
                    }
                });

        return listResult;

    }

    public PuntoBean getDatosPuntoPorCliente(final String codClienteBanco, 
                                             final String codEquiCliente, 
                                             final String codEquiAgen) {

        String SQL = 
            "{ call APERTURA.HWPG_PUNT.HWPR_RETU_PUNT_CLIE(?,?,?,?,?, ?,?,?,?,?, ?,?) }";CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
        int respuesta = 0;
        final PuntoBean puntoBean = new PuntoBean();
        this.jdbcTemplate.execute(SQL, new CallableStatementCallback() {
                    public Object doInCallableStatement(CallableStatement arg0) throws DataAccessException, 
                                                                                       SQLException {
                        String resultado = null;
                        arg0.setString(1, codClienteBanco);
                        arg0.setString(2, codEquiCliente);
                        arg0.setString(3, codEquiAgen);
                        arg0.registerOutParameter(4, OracleTypes.VARCHAR);
                        arg0.registerOutParameter(5, OracleTypes.VARCHAR);
                        arg0.registerOutParameter(6, OracleTypes.VARCHAR);
                        arg0.registerOutParameter(7, OracleTypes.VARCHAR);
                        arg0.registerOutParameter(8, OracleTypes.VARCHAR);
                        arg0.registerOutParameter(9, OracleTypes.VARCHAR);
                        arg0.registerOutParameter(10, OracleTypes.VARCHAR);
                        arg0.registerOutParameter(11, OracleTypes.VARCHAR);
                        arg0.registerOutParameter(12, OracleTypes.VARCHAR);
                        arg0.execute();
                        resultado = arg0.getString(12);
                        if (resultado != null && !resultado.equals("0")) {
                            puntoBean.setCodPunto(arg0.getString(4));
                            puntoBean.setDesPunto(arg0.getString(5));
                            puntoBean.setDespuntoDirec(arg0.getString(6));
                            puntoBean.setCodCliente(arg0.getString(7));
                            puntoBean.setCodEquiAgen(arg0.getString(8));
                            puntoBean.setDesEquiAgen(arg0.getString(9));
                            puntoBean.setCodMatriz(arg0.getString(10));
                            puntoBean.setDesMatriz(arg0.getString(11));
                        }

                        return puntoBean;
                    }
                });

        return puntoBean;

    }
    
    public List buscarPuntoAbono(final String descPunto, 
                                 final String cliente, 
                                 final String sucursal) throws Exception    {
                                 
    String SQL = "{ call APERTURA.HWPG_PUNT.HWPR_LIST_CLIE_ABON(?,?,?,?,? ,?) }";
    final List listResult = new ArrayList();
        CadenaUtil.logSQL(this.getClass(),new Exception().getStackTrace()[0].getMethodName(),SQL);
    this.jdbcTemplate.execute(SQL, new CallableStatementCallback() {
                public Object doInCallableStatement(CallableStatement arg0) throws DataAccessException, 
                                                                                   SQLException {
                    arg0.setString(1, descPunto);
                    arg0.setString(2, cliente);
                    arg0.setString(3, sucursal);                                                
                    arg0.registerOutParameter(4, OracleTypes.CURSOR);
                    arg0.registerOutParameter(5, OracleTypes.NUMBER);
                    arg0.registerOutParameter(6, OracleTypes.VARCHAR);                        
                    arg0.execute();
                    
                    String codError = arg0.getString(5);
                    String mensajeError = arg0.getString(6);                        
                    logger.info("respuesta de Ejecucion: " + new StringBuffer(codError).append(mensajeError).toString());
                    
                    if (codError!=null && codError.equals(String.valueOf(ConstantesHermetic.RESULT_SP_OK))){
                        //resultado correcto
                         ResultSet rs = (ResultSet)arg0.getObject(4);                             
                         PuntoBean puntoBean = null;
                         while (rs.next()) {
                             puntoBean = new PuntoBean();                            
                             puntoBean.setDesPunto(rs.getString("des_punt"));
                             puntoBean.setDesDire(rs.getString("des_dire_punt"));
                             puntoBean.setCodPunto(rs.getString("cod_punt"));
                             listResult.add(puntoBean);
                         }
                    }else{
                        //resultado con errores                           
                        logger.error("Error de Ejecucion: " + new StringBuffer(codError).append(mensajeError).toString());                    
                    }    

                    return listResult;
                }
            });

    return listResult;
    }
    public List getListMatrices(String codCliente,String codSucursal,String desSucursal){
        Map map = new HashMap();
        map.put("P_COD_CLIENTE",codCliente);
        map.put("P_COD_SUCURSAL",codSucursal);
        map.put("P_DES_SUCURSAL",desSucursal);
        List listMatrices;
        int erro = 0;
        try{
            sqlMapClient.queryForObject("getListMatrices",map);
            erro=(Integer)map.get("S_ERRO");
            if(erro==0)
                listMatrices = (List)map.get("S_LIST");
            else
                throw new Exception((String)map.get("S_MENS"));
        }catch(Exception e){
            logger.error(e);
            e.printStackTrace();
            listMatrices = new ArrayList();
        }
        return listMatrices;
    }
    public boolean getIsMatrizActive(String codCliente,String codSucursal){
        boolean isMatrizActive = false;
        Map map = new HashMap();
        map.put("P_COD_CLIENTE",codCliente);
        map.put("P_COD_SUCURSAL",codSucursal);
        try{
            sqlMapClient.queryForObject("getIsMatrizActive",map);
            isMatrizActive = (Boolean)map.get("S_RESU");
            logger.info(" getIsMatrizActive : "+isMatrizActive);
            
        }catch(Exception e){
            logger.error(e);
            isMatrizActive = false;
        }
        return isMatrizActive;
    }    
public String getDesMatrizFromClieAndPunt(String codCliente,String codPunt){
        Map map = new HashMap();
        map.put("P_COD_CLIENTE",codCliente);
        map.put("P_COD_PUNT",codPunt);
        List listMatriz = new ArrayList();
        String desMatriz = "";
        try{
            sqlMapClient.queryForObject("getMatrizFromClieAndPunt",map);
            int erro =(Integer)map.get("S_ERRO"); 
            if(erro==0){
                listMatriz = (List)map.get("S_LIST");
                if(listMatriz.size()>0)
                    return ((MatrizBean)listMatriz.get(0)).getDesMat();
            }
        }catch(Exception e){
            logger.error(e);
            return "";
        }
        return "";
    }       
 
    public boolean getParamActive(String codCliente,String codSucursal, String codParamOpci, String codParam){
        boolean paramActive = false;
        Map map = new HashMap();
        map.put("P_COD_CLIENTE",codCliente);
        map.put("P_COD_SUCURSAL",codSucursal);
        map.put("P_COD_PARM_OPCI",codParamOpci);
        map.put("P_COD_PARM",codParam);
        try{
            sqlMapClient.queryForObject("getParamActive",map);
            paramActive = (Boolean)map.get("S_RESU");
        }catch(Exception e){
            logger.error(e);
            paramActive = false;
        }
        return paramActive;
    }
    
    public int inseVeCliePunt(String codCliente,String codPunto,String codMatriz){
        int erro = 0;
        Map map = new HashMap();
        map.put("P_COD_CLIENTE",codCliente);
        map.put("P_COD_PUNT",codPunto);
        map.put("P_COD_MAT",codMatriz);
        try{
            sqlMapClient.queryForObject("inseVeCliePunt",map);
            erro = (Integer)map.get("S_ERRO");
        }catch(Exception e){
            logger.error(e);
            erro=1;
        }
        return erro;
    }
    
    public int modiVeCliePunt(String codCliente,String codPunto,String codMatriz){
        int erro = 0;
        Map map = new HashMap();
        map.put("P_COD_CLIENTE",codCliente);
        map.put("P_COD_PUNT",codPunto);
        map.put("P_COD_MAT",codMatriz);
        try{
            sqlMapClient.queryForObject("modiVeCliePunt",map);
            erro = (Integer)map.get("S_ERRO");
        }catch(Exception e){
            logger.error(e);
            erro=1;
        }
        return erro;
    }
    public boolean existeMatrizparaPunto(String codCliente,String codPunto){
        boolean existeMatrizparaPunto = false;
        Map map = new HashMap();
        map.put("P_COD_CLIENTE",codCliente);
        map.put("P_COD_PUNT",codPunto);
        try{
            sqlMapClient.queryForObject("existeMatrizparaPunto",map);
            existeMatrizparaPunto = (Boolean)map.get("S_EXIST");
        }catch(Exception e){
            logger.error(e);
            existeMatrizparaPunto = false;
        }
        return existeMatrizparaPunto;
    }
    
    public String getCodSucuHtbFromEquiAgen(String codCliente,String codEquiAgen){
            String codSucuHtb = "0";
            Map map = new HashMap();
            map.put("P_COD_CLIE_GRUP",codCliente);
            map.put("P_COD_EQUI_AGEN",codEquiAgen);
            try{
                sqlMapClient.queryForObject("getCodSucuHtbFromEquiAgen",map);
                codSucuHtb = (String)map.get("S_COD_SUCU_HTB");
            }catch(Exception e){
                logger.error(e);
                codSucuHtb = "1";
            }
            return codSucuHtb;
        }

    public List<PuntoBean> getListPuntRazoSoci(String desPunt,String codClie,String codBanc,String codSucu){
      List<PuntoBean> listPunt=new ArrayList<PuntoBean>();
      Map map = new HashMap();
      map.put("P_DES_PUNT",desPunt);
      map.put("P_COD_CLIE",codClie);
      map.put("P_COD_BANC",codBanc);
      map.put("P_LIST_SUCU",codSucu);
      try{
          sqlMapClient.queryForObject("getListPuntRazoSoci",map);
          int erro =(Integer)map.get("S_ERRO"); 
          if(erro==0){
              listPunt = (List<PuntoBean>)map.get("S_LIST");              
          }
      }catch(Exception e){
          logger.error(e);
      }
      return listPunt;
    }
   
}
